perm filename CONVOL.SAI[PIC,HE] blob
sn#426043 filedate 1979-03-13 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 IFC DECLARATION(BAYSAISW!) THENC
C00008 ENDMK
C⊗;
IFC DECLARATION(BAYSAISW!) THENC
REDEFINE STALONE="FALSE";
INTERNAL INTEGER PROCEDURE CONVOL(INTEGER MS,NUMMAS; STRING MFIL; INTEGER IBUF; REFERENCE INTEGER DBUF);
ELSEC
REDEFINE STALONE="TRUE";
ENDC
BEGIN "CONVO"
REDEFINE !="COMMENT";
REQUIRE "PICBUF.DCL" SOURCE!FILE;
REQUIRE "UTILS.DCL" SOURCE!FILE;
REQUIRE "tenexio.sai" SOURCE!FILE;
IFC STALONE THENC
REQUIRE "VISION.REL" LIBRARY;
INTEGER MS,NUMMAS,IBUF,DBUF;
STRING MFIL;
ENDC
STRING FILN;
INTEGER MS2,HW,I,J,II,JJ,IPTR,VAL,DPTR,MPTR,MBUF,CHAN,AVAL,CURWT;
INTEGER DIRN,NAMN,EXTN;
INTEGER IMIN,JMIN,IMAX,JMAX,K;
INTEGER CONV8TO12;
SAFE OWN INTEGER ARRAY V,WT[0:6];
PRELOAD!WITH 0,1,2,4,5,7,8;
SAFE OWN INTEGER ARRAY MAP[0:6];
SAFE OWN INTEGER ARRAY M[0:6,0:81];
SAFE OWN INTEGER ARRAY SPTR[0:9];
SAFE INTEGER ARRAY HDR[0:127];
IFC STALONE THENC
BUFINIT;
PRINT("MASK SIZE: "); MS←CVD(INTTY);
pagset(2*ms);
PRINT("NUMBER OF MASKS: "); NUMMAS←CVD(INTTY);
ENDC
IF NUMMAS<0 THEN BEGIN NUMMAS←ABS(NUMMAS); CONV8TO12←-1 END ELSE CONV8TO12←0;
MS2←MS*MS;
HW←(MS-1)%2;
IFC STALONE THENC
PRINT("MASK FILE: ");
CHAN←OPENFILE("","RC");
ELSEC CHAN←OPENFILE(MFIL,"RC"); ENDC
DIRN←CVSIX(JFNS(CHAN,'010000000000));
NAMN←CVSIX(JFNS(CHAN,'001000000000));
fXTN←CVSIX(JFNS(CHAN,'000100000000));
ARRCLR(WT);
FOR I←1 STEP 1 UNTIL NUMMAS DO
ARRYIN(CHAN,M[I,1],MS2);
FOR II←1 STEP 1 UNTIL NUMMAS DO
BEGIN
FOR I←1 STEP 1 UNTIL MS2 DO
WT[II]←WT[II]+ABS(M[II,I]);
WT[II]←WT[II]%2;
END;
CFILE(CHAN);
IFC STALONE THENC
WHILE TRUE DO BEGIN
PRINT("IMAGE NAME: "); FILN←INTTY;
INDMP(GETDEV(FILN,"DAT"),FILN,IBUF←FNDBUF(1),0);
ENDC
IMAX←ROWS(IBUF); JMAX←COLMS(IBUF);
IMIN←ISUBST(IBUF); JMIN←JSUBST(IBUF);
GETBUF(IMAX,JMAX,8,MBUF←FNDBUF);
GETBUF(IMAX,JMAX,4,DBUF←FNDBUF);
JMIN←IMIN←HW+1;
IMAX←IMAX-HW;
JMAX←JMAX-HW;
FOR I←IMIN STEP 1 UNTIL IMAX DO BEGIN
DPTR←OUTPTR(I,JMIN,DBUF);
MPTR←OUTPTR(I,JMIN,MBUF);
FOR J←-HW STEP 1 UNTIL HW DO SPTR[J+HW+1]←INPTR(I+J,1,IBUF);
FOR J←JMIN STEP 1 UNTIL JMAX DO BEGIN
K←0;
ARRCLR(V);
FOR II←1 STEP 1 UNTIL MS DO BEGIN
IPTR←SPTR[II]; IBP(SPTR[II]);
FOR JJ←1 STEP 1 UNTIL MS DO BEGIN "CONINN"
V[1]←V[1]+M[1,K←K+1]*(VAL←ILDB(IPTR));
V[2]←V[2]+M[2,K]*VAL;
V[3]←V[3]+M[3,K]*VAL;
V[4]←V[4]+M[4,K]*VAL;
IF NUMMAS=4 THEN CONTINUE;
V[5]←V[5]+M[5,K]*VAL;
V[6]←V[6]+M[6,K]*VAL;
END;
END;
COMMENT FIND MAXIMUM;
COMMENT FOR II←1 STEP 1 UNTIL NUMMAS DO V[II]←V[II]%WT[II];
COMMENT THE WEIGHTING WAS CHANGED, IT IS IN THE COMPARISON
AS A MULTIPLY;
AVAL←ABS(V[1]); K←1; CURWT←WT[1];
FOR II←2 STEP 1 UNTIL NUMMAS DO
IF (ABS(V[II])*CURWT)>(AVAL*WT[II])
THEN BEGIN AVAL←ABS(V[II]); CURWT←WT[II]; K←II END;
IF CONV8TO12=0 THEN IDPB(IF V[K]<0 THEN K+NUMMAS ELSE K,DPTR)
ELSE IDPB(IF V[K]<0 THEN MAP[K]+6 ELSE MAP[K],DPTR);
AVAL←AVAL%CURWT;
IDPB(AVAL,MPTR);
END;
END;
GETHDR(HDR,DBUF);
HDR[127]←EXTN; HDR[126]←NAMN; HDR[125]←DIRN;
HDR[124]←IF CONV8TO12=0 THEN NUMMAS ELSE 6; HDR[123]←MS;
PUTHDR(HDR,DBUF);
IFC STALONE THENC
OUTDMP(GETDEV(FILN←MFIL←NAMFIL(FILN),"DIR"),FILN,DBUF,0);
ENDC
GETHDR(HDR,MBUF);
HDR[127]←EXTN; HDR[126]←NAMN; HDR[125]←DIRN;
HDR[124]←NUMMAS; HDR[123]←MS;
PUTHDR(HDR,MBUF);
IFC STALONE THENC
OUTDMP(GETDEV(MFIL,"OUT"),MFIL,MBUF,0);
FREBUF(IBUF); FREBUF(DBUF); FREBUF(MBUF);
END;
ELSEC RETURN(MBUF);
ENDC
END;